#ifndef QIANDISK_INC_FILEIO_H
#define QIANDISK_INC_FILEIO_H


#include <sys/stat.h>  // posix: file info - mkdir
#include <libgen.h> // dirname basename

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include <math.h>

#include "qd_datas.h"
#include "qd_types.h"
#include "qd_utils.h"

#include "qd_env.h"



// 设置块大小, 分块读写磁盘文件
// 仅控制读写, 不保存文件信息
class FileIO{

private:

    FILE        *mFp;           // 文件指针
    char        mFilePath[255]; // 文件绝对路径

    int         mBlockSize;     // 块大小

    QUINT_64    mSize;
public:
    FileIO() = default;

    // 客户端打开本地文件, 需要完整路径
    FileIO(const char *__filename, int blockSize, QUINT_64 size);

    // 服务端打开文件, 需要配置完整路径
    FileIO(const char *_user, const char *_path, const char *_name, int blockSize, QUINT_64 size);

    // -1 打开失败, 0 打开成功
    int Open(const char * __mode);   // mode: 打开模式   r  w


    //  buffLen 需要写入的长度, 如果 blockSize > buffLen 会写入多余的 '\0' 字符, 所以需要控制 buffLen
/*
    //  写入文件 index: 需要写入的块            buffLen
    int Write(int index, int buffLen, char *buff);

    //  读取文件 index 需要读取的块, 将数据保存到 buff中
    int Read(int index, char *buff);
*/

    // 字节读写文件 // 返回实际写入的字节
    int Write(char *buff, int len);
    // 实际读取的字节数
    int Read(char *buff, int len);

    /**
        块索引从 0 开始,
        fseek(fp, index * mBlockSize, SEEK_SET);
    */

    int Create(const char *path);
/*


*/

    // 获取当前文件
    FILE *getFP();

    QUINT_64 getSize();

    void Close();

    int getBlockSize();


    ~FileIO();

};


//  本地文件管理, 路径识别, 文件夹管理
class FileManager{
private:
    FileIO      *mLocalFile;
public:
    void SetRealPath();
    FileManager() = default;
    ~FileManager() = default;
};

class FileInfo{
private:
    char   mPath[127]; // 相对路径
    char   mName[127]; // 文件名   // 未来设计成 UUID 的形式, 将实际文件名保存在数据库中
    char   mFull[255]; // 全路径
    QUINT_64 mSize;      // 大小
public:
    FileInfo(const char *_filePath);
    QUINT_64 getSize();
    
    // 获取文件信息
    char* getName();

    ~FileInfo();
};
#endif // QIANDISK_INC_FILEIO_H

